Celem przeprowadzonej analizy była ocena właściwości materiałów grafenowych wykorzystywanych w elektrodach superkondensatorów oraz identyfikacja parametrów mających największy wpływ na ich pojemność właściwą. Analizowany zbiór obejmuje 925 obserwacji i 21 atrybutów, opisujących zarówno parametry elektrochemiczne i warunki testowe, jak i cechy strukturalne badanych materiałów.
Dane zostały poddane wstępnemu przygotowaniu: kolumny oczyszczono i ujednolicono, wartości liczbowe skonwertowano do odpowiednich typów, a brakujące dane wypełniono medianą, co pozwala ograniczyć wpływ wartości odstających. Kluczowe zmienne takie jak pojemność, powierzchnia właściwa (SSA) i gęstość prądu wykazywały znaczną zmienność. Pojemność materiałów wahała się od 1.4 F/g do 3344 F/g, co odzwierciedla szeroki zakres technologii syntezy i różnice w strukturze analizowanych elektrod.
Analiza rozkładów pokazała, że pojemność ma rozkład silnie skośny, z przewagą materiałów o niskich i średnich wartościach oraz nielicznymi przypadkami o bardzo wysokiej pojemności. W przypadku SSA większość materiałów skupia się w okolicach 160 m²/g, a tylko nieliczne przekraczają 1000 m²/g. Wartości gęstości prądu były bardzo zróżnicowane, dlatego zastosowanie skali logarytmicznej pozwoliło uwidocznić typowe, często stosowane zakresy testowe.
Analiza korelacji wykazała, że SSA oraz pojemność są dodatnio skorelowane, materiały o większej powierzchni właściwej wykazują lepsze właściwości magazynowania ładunku. Objętość porów (pore volume) nie wykazywała silnej korelacji z pojemnością, co sugeruje, że sama objętość mikroporów nie jest wystarczającym predyktorem wydajności. Zawartość pierwiastków takich jak N, C i O również nie wykazała liniowej zależności z pojemnością, co wskazuje na bardziej złożoną, nieliniową naturę oddziaływań chemicznych. Interaktywny wykres SSA vs. pojemność potwierdził jasną tendencję wzrostową, materiały o większej powierzchni właściwej zwykle osiągają większą pojemność, jednak zależność ta jest dodatkowo modulowana przez gęstość prądu.
Do przewidywania pojemności opracowano model Random Forest, który wykorzystał wybrane cechy strukturalne i testowe. Model uzyskał około 25% wyjaśnionej wariancji oraz dość wysoki błąd MSE, co sugeruje wysoki poziom szumu w danych oraz złożoność rzeczywistych zależności między parametrami materiałów. Metody XAI (feature importance i SHAP) potwierdziły, że najważniejszą zmienną pozostaje SSA, zgodnie z wynikami analizy korelacji. Istotny wpływ wykazały także gęstość prądu oraz objętość porów. Analiza wartości SHAP pokazała, że efekty zmiennych mają charakter addytywny, ale ich działanie jest zróżnicowane w zależności od konkretnej obserwacji, co sugeruje nieliniową naturę problemu.
Powierzchnia właściwa (SSA) jest najistotniejszym czynnikiem determinującym pojemność superkondensatora, co potwierdzono za pomocą statystyk opisowych, korelacji i modelu predykcyjnego.
Dane literaturowe charakteryzują się dużą zmiennością, co obniża dokładność modeli predykcyjnych, ale jednocześnie odzwierciedla różnorodność metod syntezy i struktury materiałów.
Gęstość prądu znacząco wpływa na obserwowaną pojemność materiały testowane przy niskich wartościach osiągają lepsze wyniki, dlatego parametr ten należy zawsze uwzględniać przy porównaniach.
Zawartości N, C i O nie wykazują silnych zależności liniowych z pojemnością, co wskazuje, że w analizie tego typu materiałów konieczne mogą być modele nieliniowe lub dodatkowe zmienne chemiczne.
Modele uczenia maszynowego mają potencjał, lecz wymagają rozszerzonego zestawu danych, lepszej standaryzacji warunków eksperymentalnych i możliwego podziału na klasy materiałów
Dane importowane są z pliku “data.csv”. Dla ułatwienia nazwy kolumn zostają oczyszczone ze spacji i znaków specjalnych, a wszystkie litery zmienione na małe.
data <- read_csv("data.csv", show_col_types = FALSE)
data <- data %>% clean_names()
colnames(data)[1:10]
## [1] "ref" "limits_of_potential_window_v"
## [3] "lower_limit_of_potential_window_v" "upper_limit_of_potential_window_v"
## [5] "potential_window_v" "current_density_a_g"
## [7] "capacitance_f_g" "specific_surface_area_m_2_g"
## [9] "charge_transfer_resistance_rct_ohm" "equivalent_series_resistance_rs_ohm"
Kluczowe dane konwertowane są na liczby, a następnie, jeśli to możliwe brakujące wartości zastępowane są medianą, ponieważ jest ona odporna na wartości odstające. Wiersze bez zmiennej celowej są usuwane.
data_clean <- data %>%
mutate(
capacitance_f_g = as.numeric(capacitance_f_g),
specific_surface_area_m_2_g = as.numeric(specific_surface_area_m_2_g),
current_density_a_g = as.numeric(current_density_a_g)
) %>%
mutate(across(where(is.numeric), ~ifelse(is.na(.), median(., na.rm = TRUE), .))) %>%
filter(!is.na(capacitance_f_g))
n_rows <- nrow(data_clean)
n_cols <- ncol(data_clean)
cat("Liczba wierszy:", n_rows, "\nLiczba kolumn:", n_cols, "\n")
## Liczba wierszy: 925
## Liczba kolumn: 21
data_clean %>%
select(capacitance_f_g, specific_surface_area_m_2_g, current_density_a_g) %>%
summary() %>%
kable()
| capacitance_f_g | specific_surface_area_m_2_g | current_density_a_g | |
|---|---|---|---|
| Min. : 1.4 | Min. : 8.896 | Min. : 0.05 | |
| 1st Qu.: 150.8 | 1st Qu.: 159.970 | 1st Qu.: 1.00 | |
| Median : 260.2 | Median : 159.970 | Median : 2.00 | |
| Mean : 412.6 | Mean : 258.225 | Mean : 5.79 | |
| 3rd Qu.: 493.6 | 3rd Qu.: 159.970 | 3rd Qu.: 5.00 | |
| Max. :3344.1 | Max. :2400.000 | Max. :200.00 |
Wykresy prezentują najważniejsze parametry: pojemność, powierzchnię właściwą oraz gęstość prądu w skali logarytmicznej dla lepszej czytelności danych.
ggplot(data_clean, aes(x = capacitance_f_g)) +
geom_histogram(bins = 30, fill = "blue", color = "white") +
theme_minimal() +
labs(title = "Rozkład Pojemności", x = "Capacitance (F/g)")
ggplot(data_clean, aes(x = specific_surface_area_m_2_g)) +
geom_histogram(bins = 30, fill = "green", color = "white") +
theme_minimal() +
labs(title = "Rozkład SSA", x = "Specific Surface Area (m^2/g)")
ggplot(data_clean, aes(x = current_density_a_g)) +
geom_histogram(bins = 30, fill = "red", color = "white") +
scale_x_log10() +
theme_minimal() +
labs(title = "Rozkład Gęstości Prądu (log)", x = "Current Density (A/g)")
Macierz korelacji obrazuje siłę i kierunek zależności między wybranymi parametrami fizykochemicznymi a wydajnością elektrod.
numeric_data <- data_clean %>%
select(
capacitance_f_g,
specific_surface_area_m_2_g,
current_density_a_g,
pore_volume_cm_3_g,
n_at_percent,
c_at_percent,
o_at_percent,
potential_window_v
) %>%
rename(
"Pojemnosc" = capacitance_f_g,
"SSA" = specific_surface_area_m_2_g,
"Gestosc_Pradu" = current_density_a_g,
"Objetosc_Porow" = pore_volume_cm_3_g,
"Azot_N%" = n_at_percent,
"Wegiel_C%" = c_at_percent,
"Tlen_O%" = o_at_percent,
"Okno_Potencjalowe" = potential_window_v
)
M <- cor(numeric_data, use = "complete.obs")
corrplot(M,
method = "color",
type = "upper",
order = "hclust",
addCoef.col = "black",
tl.col = "black",
tl.srt = 45,
number.cex = 0.7,
diag = FALSE,
col = colorRampPalette(c("red", "white", "green"))(200)
)
Wykresy pozwalają na badanie relacji między powierzchnią właściwą a pojemnością z uwzględnieniem gęstości prądu (kolor punktu), co umożliwia identyfikację trendów i anomalii danych.
plot_interactive <- ggplot(data_clean, aes(x = specific_surface_area_m_2_g,
y = capacitance_f_g,
color = current_density_a_g)) +
geom_point(alpha = 0.7) +
theme_minimal() +
labs(title = "Zależność SSA vs Pojemność", x = "SSA (m^2/g)", y = "Pojemność (F/g)")
ggplotly(plot_interactive)
Zbudowano model Random Forest do przewidywania pojemności materiału. Zastosowano metody wyjaśnialnej sztucznej inteligencji (XAI), w tym analizę ważności cech oraz wartości SHAP dla przykładowej obserwacji.
model_data <- data_clean %>%
select(capacitance_f_g, specific_surface_area_m_2_g, current_density_a_g,
pore_volume_cm_3_g, n_at_percent, o_at_percent)
model_rf <- randomForest(capacitance_f_g ~ ., data = model_data, importance = TRUE, ntree = 100)
print(model_rf)
##
## Call:
## randomForest(formula = capacitance_f_g ~ ., data = model_data, importance = TRUE, ntree = 100)
## Type of random forest: regression
## Number of trees: 100
## No. of variables tried at each split: 1
##
## Mean of squared residuals: 148141.4
## % Var explained: 24.73
explainer <- explain(
model = model_rf,
data = model_data %>% select(-capacitance_f_g),
y = model_data$capacitance_f_g,
label = "Random Forest",
verbose = FALSE
)
vip <- model_parts(explainer)
plot(vip) + ggtitle("Ważność cech w modelu")
shap_values <- predict_parts(explainer, new_observation = model_data[1, ], type = "shap")
plot(shap_values) + ggtitle("Wartości SHAP dla pierwszej obserwacji")